/*
Copyright © 2025 NAME HERE <EMAIL ADDRESS>
*/
package global

import (
	"fmt"
	"os"

	"github.com/spf13/cobra"
	"gopkg.in/ini.v1"
	"nodemessage.com/ruov-cli/consts"
	"nodemessage.com/ruov-cli/rlog"
	"nodemessage.com/ruov-cli/utils"
)

// GetCmd represents the get command
var GetCmd = &cobra.Command{
	Use:   "get [section] [key]",
	Short: "获取配置项的值",
	Long: `从配置文件中获取指定配置项的值。
示例:
  ruov global get global version  # 获取全局版本配置
  ruov global get database host   # 获取数据库主机配置`,
	Args: cobra.MinimumNArgs(1),
	Run: func(cmd *cobra.Command, args []string) {
		if len(args) == 1 {
			getSection(args[0])
		} else if len(args) >= 2 {
			getValue(args[0], args[1])
		}
	},
}

// getSection 获取指定配置节的所有键值对
func getSection(section string) {
	// 检查section是否允许读取
	if !utils.IsAllowedSection(section) {
		rlog.Logger.Error("读取受限配置节: %s", section)
		rlog.Logger.Error("配置节 [%s] 不允许读取", section)
		return
	}

	// 加载配置
	_, err := utils.LoadSetting()
	if err != nil {
		if os.IsNotExist(err) {
			rlog.Logger.Error("配置文件不存在: %v", err)
			rlog.Logger.Error("配置文件不存在，请先运行 'ruov global install' 命令")
		} else {
			rlog.Logger.Error("加载配置失败: %v", err)
			rlog.Logger.Error("无法加载配置: %v", err)
		}
		return
	}

	// 使用ini库读取指定节
	cfg, err := ini.Load(consts.SettingFile)
	if err != nil {
		rlog.Logger.Error("读取配置文件失败: %v", err)
		rlog.Logger.Error("无法解析配置文件: %s", consts.SettingFile)
		return
	}

	// 检查节是否存在
	sec, err := cfg.GetSection(section)
	if err != nil {
		rlog.Logger.Error("未找到配置节: %s", section)
		return
	}

	// 获取所有键值对
	keys := sec.Keys()
	if len(keys) == 0 {
		rlog.Logger.Warn("配置节 %s 中没有找到任何键值对", section)
		return
	}

	// 显示节中的所有键值对
	rlog.Logger.Info("配置节 [%s]:", section)
	for _, key := range keys {
		fmt.Printf("  %s = %s\n", key.Name(), key.Value())
	}
}

// getValue 获取指定配置项的值
func getValue(section, key string) {
	value, err := utils.GetConfigValue(section, key)
	if err != nil {
		rlog.Logger.Error("获取配置值失败: %v", err)
		rlog.Logger.Error("获取配置失败: %v", err)
		return
	}

	// 直接输出值
	fmt.Println(value)
}
